// new 手写

function Person(name, age){
    // 函数的运行过程就是构造对象的过程 
    this.name = name;
    this.age = age;
    // return {}
}

Person.prototype.say = function(){
    console.log(this.age);
}

let p2 = {}
console.log(p2.__proto__);
//p2.__proto__    // Object
p2 = new Person('李', 18);
console.log(Object.hasOwnProperty('name'), Object.hasOwnProperty('say'));

// p2 ? 做了什么事情？ 给？
// p2.__proto__ Object -> Person.prototype
// JS 是原形式的面向对象
// p2 的原型对象， 由默认Object 中间插入Person.prototype
// p2.say
// 手写new
// new Person()
// reset 运算符
function myNew(fn, ...args){
    // console.log(fn, args);
    // Object.create
    let obj = Object.create(fn.prototype)
    console.log(obj, '......', obj.__proto__);
    // obj 上 , this 属性
    // 构造的过程  函数运行一下， 并且 this 指向obj
    Person.call(obj, ...args);
    console.log(obj, '.....');
    // 原型的设置
    // 返回 对象
    return obj;
}
let p3 = myNew(Person, '王五', 18);
console.log(p3);